package cn.tedu.test.selector;

import cn.tedu.test.annotation.KeyAnnotation;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.io.support.SpringFactoriesLoader;
import org.springframework.core.type.AnnotationMetadata;

import java.util.List;
import java.util.Set;
import java.util.function.Predicate;

/**
 * 容器导入配置类的选择器
 * 1. 通过类名称选择
 * 2. 定义选择的一些过滤逻辑
 */
public class MySelector implements ImportSelector{
    /**
     * 一次性导入多个配置类
     * @param importingClassMetadata 导入当前选择器的配置类的元数据(反射元数据)
     * @return String[] 每个元素就是想要导入的配置类的全路径名称
     * 大量的配置类存在时,完全可以将这种字符串数组放到外部文件,通过加载文件生成String[]
     */
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        //选择器 导入spring.factories 文件 MyConfiguraitn02
        List<String> strings = SpringFactoriesLoader.
                loadFactoryNames(KeyAnnotation.class,
                        this.getClass().getClassLoader());
        return strings.toArray(new String[1]);
    }

    /**
     * 用来做过滤的
     */
    @Override
    public Predicate<String> getExclusionFilter() {
        return ImportSelector.super.getExclusionFilter();
    }
}
